function init() {
	// 设置光标，初始化光标不可见
	$('.novel').append('<span class="cursor"></span>');
	$('.cursor').height('0px');
	// 不使用v-show。因为某些字体会导致inline-block元素出现影响其父元素的高度。
}
init();
let vm = new Vue({
	el: '.novel',
	data: {
		tick: true,
		cursorTimer: null,			// 光标闪烁timer，无需改动
		cursorStatus: false,		// 光标显示状态，无需改动
		name: null,					// 名称
		text: null,					// 当前显示文本
		visibleText: null,
		currentRow: 0,				// 当前读到文本数组的索引
		currentChar: 0,
		color: null,				// 当前文本颜色
		showTextTimer: null,		// 当前文本行timer，无需改动
		showCharTimer: null,		// 当前文字timer，无需改动
		isShowOver: true,			// 文本是否过渡完毕，无需改动
	},
});

// 设置名称
function setName(name = '') {
	vm.name = name;
}

// 设置颜色
function setColor(color) {
	if(color != '' && color != null) {
		vm.color = color;
	}
}

// 设置文本
function setText(text = [], color) {
	vm.text = text;
	vm.visibleText = new Array(0);
	setColor(color);
}

// 显示文本
function showText(millisecond = 2000, name, text, color) {
	// 防止用户不设置名称和文本
	if(vm.name == null) {
		if(name == null) {console.error("未设置名称。"); return;}
		setName(name);
	}
	if(vm.text == null) {
		if(text == null) {console.error("未设置文本。"); return;}
		setText(text);
	}
	if(vm.color == null) setColor(color);
	
	clearInterval(vm.showTextTimer);
	vm.showTextTimer = setInterval(function() {
		if(vm.currentRow >= vm.text.length) {
			clearInterval(vm.showTextTimer);
			return;
		}
		// 创建新的行
		vm.visibleText.push(name);
		// 乐观锁，若当前文本未读完，禁止显示下一条
		if(!vm.isShowOver) return;
		vm.isShowOver = false;
		// 开启新的定时器，用于逐字显示
		clearInterval(vm.showCharTimer);
		vm.showCharTimer = setInterval(function() {
			if(vm.currentChar < vm.text[vm.currentRow].length) {
				// 每次向visibleText添加一个字符，该字符来自text对应的位置。
				vm.visibleText[vm.currentRow] += vm.text[vm.currentRow].charAt(vm.currentChar);
				++vm.currentChar;
				// 设置颜色
				if(color != null) {
					$('.msg:eq('+ vm.currentRow +')').css('color', vm.color);
				}
				// 强制刷新vm，否则v-for内容的渲染不会更新
				vm.$forceUpdate();
			}else {
				// 显示完毕，清除定时器
				vm.isShowOver = true;
				clearInterval(vm.showCharTimer);

				++vm.currentRow;
				vm.currentChar = 0;
				vm.$forceUpdate();
			}
		}, 20);
	}, millisecond);
}

// 显示/关闭光标
function showCursor(flag, millisecond = 800) {
	if(flag) {
		clearInterval(vm.cursorTimer);
		vm.cursorTimer = setInterval(function() {
			if(vm.cursorStatus) {
				$('.cursor').height('15px');
			}else {
				$('.cursor').height('0px');
			}
			vm.cursorStatus = !vm.cursorStatus;
		}, millisecond);
	}else {
		vm.cursorStatus = false;
		clearInterval(vm.cursorTimer);
	}
}